package model

import (
	"github.com/jinzhu/gorm"
	_const "go-admin/internal/model/const"
)

// 字典
type Dict struct {
	CommonModel
	IsSystem string `json:"isSystem"` // 是否是系统内置 '0': 不是 '1': 是
	IsBanned string `json:"isBanned"` // 是否禁用
	Type     string `json:"type"`     // 字典类型
	DictName string `json:"dictName"` // 字典名称
	Remark   string `json:"remark"`   // 备注信息
}

// 重置表名
func (d *Dict) TableName() string {
	return "sys_dict"
}

// 获取总数
func (d *Dict) Count(db *gorm.DB) (int, error) {
	var count int
	if d.IsBanned != "" {
		db = db.Where("is_banned = ?", d.IsBanned)
	}
	if d.IsSystem != "" {
		db = db.Where("is_system = ?", d.IsSystem)
	}
	if d.DictName != "" {
		db = db.Where("dict_name LIKE ?", "%"+d.DictName+"%")
	}
	if err := db.Model(&d).Where("is_del = ?", _const.ISDEL).Count(&count).Error; err != nil {
		return 0, err
	}
	return count, nil
}

// 创建
func (d *Dict) Create(db *gorm.DB) (string, error) {
	err := db.Create(&d).Error
	if err != nil {
		return "", err
	}
	return d.Id, nil
}

// 获取字典列表
func (d *Dict) List(db *gorm.DB, pageOffset, pageSize int) ([]*Dict, error) {
	var dicts []*Dict
	var err error
	db = db.Offset(pageOffset).Limit(pageSize)
	if d.IsBanned != "" {
		db = db.Where("is_banned = ?", d.IsBanned)
	}
	if d.IsSystem != "" {
		db = db.Where("is_system = ?", d.IsSystem)
	}
	if d.DictName != "" {
		db = db.Where("dict_name LIKE ?", "%"+d.DictName+"%")
	}
	if err = db.Where("is_del = ?", _const.ISDEL).Find(&dicts).Error; err != nil {
		return nil, err
	}
	return dicts, nil
}

// 更新字典信息
func (d *Dict) Update(db *gorm.DB, values interface{}) error {
	return db.Model(&d).Updates(values).Where("id = ?", d.Id).Error
}

// 批量软删除
func (d *Dict) Deletes(db *gorm.DB, ids []string, values interface{}) error {
	return db.Model(&d).Where("id IN (?)", ids).Updates(values).Error

}

// 通过字典名称和类型获取字典
func (d *Dict) GetDictByDictNameAndType(db *gorm.DB) (*Dict, error) {
	var dict Dict
	if err := db.Where("is_del = ?", _const.ISDEL).Where("dict_name = ?", d.DictName).Or("type = ?", d.Type).First(&dict).Error; err != nil {
		// 判断错误
		switch {
		case err == gorm.ErrRecordNotFound:
			// 说明没有找到
			return &dict, nil
		case err != nil:
			return &dict, err
		}
	}
	return &dict, nil
}

// 根据id获取详情
func (d *Dict) GetDictById(db *gorm.DB) (*Dict, error) {
	var dict Dict
	if err := db.Where("id = ?", d.Id).First(&dict).Error; err != nil {
		// 判断错误
		switch {
		case err == gorm.ErrRecordNotFound:
			// 说明没有找到
			return &dict, nil
		case err != nil:
			return &dict, err
		}
	}
	return &dict, nil
}
